# Cargamos los paquetes
library(tidyverse)
library(dplyr)
library(readr)
library(tidyr)
library(ggplot2)
library(ggthemes)
library(ggtext)
library(ggrepel)
library(ggforce)
library(patchwork)
library(sf)
library(mapSpain)
library(plotly)
library(jsonlite)
library(stringr)En nuestro seminario analizaremos cómo factores tecnológicos impactan en la salud mental a nivel de España.
Pregunta 1: ¿Cuál es el perfil de la población más digitalizada en España y cuál es el perfil de la población con más problemas de salud mental?
Utilizaremos datos procesados con R, provenientes de la siguiente fuente oficial:
Para entender la magnitud del problema, primero analizamos la distribución de la depresión según los siguientes factores.
Depresión por Situación Laboral y Sexo
Se representa en el eje x el porcentaje de cuadros depresivos, en el eje y la situación laboral y se dividen los resultados en hombres y mujeres.
En el siguiente gráfico vemos datos depresivos mayores en mujeres que en hombres.
Dato Crítico: El grupo de Desempleo presenta las tasas más altas de Cuadro Depresivo Mayor, superando significativamente al grupo que trabaja .
# Código extraído de: Tabla_situacion_laboral.R y Grafico_situacion_laboral.R
# Tabla
datos_grafico_estudios <- mis_datos_salud_mental$depresion_actividad_economica %>%
mutate(
Porcentaje = parse_number(Total, locale = locale(decimal_mark = ","))
) %>%
filter(
Sexo != "Ambos sexos",
Actividad.económica != "TOTAL",
Prevalencia.depresión %in% c("Cuadro depresivo mayor", "Otros cuadros depresivos")
)
# Gráfico
g_actividad_apilado <- ggplot(datos_grafico_estudios,
aes(x = reorder(Actividad.económica, Porcentaje),
y = Porcentaje,
fill = Prevalencia.depresión)) +
geom_bar(stat = "identity") +
geom_text(
aes(label = paste0(round(Porcentaje, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black",
size = 2,
fontface = "bold"
)+
facet_wrap(~ Sexo) +
coord_flip() +
labs(
title = "Depresión por Situación Laboral y Sexo",
x = "", # Dejamos vacío porque los nombres de actividad ya describen el eje
y = "Porcentaje Total (%)",
fill = "Diagnóstico"
) +
scale_fill_brewer(palette = "Blues") +
theme_minimal() +
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold")
)
print(g_actividad_apilado)Intensidad de la Depresión por nivel de estudios
Analizamos la gravedad de la depresión en función de los estudios.
Dato Crítico: Personas que tienen un nivel de estudios inferior, son las que más cuadros depresivos padecen.
# Código extraído de: Tabla_nivel_estudios.R y Grafico_nivel_estudios.R
tabla_nivel_estudios <- nivel_estudios_parseado %>%
tidyr::separate(
col = Nombre,
into = c("Sexo", "Edad", "Nivel_de_estudios", "Prevalencia_depresion"),
sep = ", "
) %>%
rename(Porcentaje = Valor) %>%
select(-Secreto)
datos_grafico_estudios <- tabla_nivel_estudios %>%
filter(
Sexo != "Ambos sexos",
Nivel_de_estudios != "Total",
Edad == "TOTAL",
Prevalencia_depresion %in% c("Cuadro depresivo mayor", "Otros cuadros depresivos")
) %>%
mutate(Nivel_de_estudios= factor(
Nivel_de_estudios, levels = c("TOTAL", "Básico e inferior", "Intermedio","Superior" )
)
)
grafico_nivel_estudios<- ggplot(datos_grafico_estudios,
aes(x = Nivel_de_estudios,
y = Porcentaje,
fill = Prevalencia_depresion)) +
geom_col() +
facet_wrap(~ Sexo) +
coord_flip() +
labs(
title = "Depresión por Nivel de Estudios y Sexo",
subtitle = "Cuadro depresivo mayor y Otros cuadros depresivos",
x = "Nivel de Estudios",
y = "Porcentaje Total de Prevalencia (%)",
fill = "Prevalencia"
) +
scale_fill_brewer(palette = "Blues") +
theme_minimal()
print(grafico_nivel_estudios)Vamos a ver la distribución de las TIC sobre el territorio español.
Hemos unificado los datos de niños, adultos y mayores para crear un “Índice Digital”
Las zonas más oscuras es donde más uso de las TICs hay, las zonas menos claras tienen un menor uso de estas.
Instrucciones: Pase el ratón por encima de cada comunidad para ver el las etiquetas de cada comunidad de uso de internet por grupos de edad.
# Código extraído de: Mapa_España_TICS.R
mapa_españa_ccaa <- esp_get_ccaa(moveCAN = TRUE)
# Corrección para mapa
uso_tic_total_corregido_mapa <- uso_tic_total %>%
mutate(
Comunidad = case_when(
Comunidad == "Asturias, Principado de"~"Asturias",
Comunidad == "Balears, Illes" ~ "Baleares",
Comunidad == "Castilla - La Mancha" ~ "Castilla-La Mancha",
Comunidad == "Comunitat Valenciana" ~ "Comunidad Valenciana",
Comunidad == "Madrid, Comunidad de" ~ "Madrid",
Comunidad == "Murcia, Región de" ~ "Murcia",
Comunidad == "Navarra, Comunidad Foral de" ~ "Navarra",
Comunidad == "Rioja, La" ~ "La Rioja",
TRUE ~ Comunidad
)
)
#Join para crear la tabla para representar el mapa
mapa_con_datos <- mapa_españa_ccaa %>%
left_join(uso_tic_total_corregido_mapa, by = c("ccaa.shortname.es" = "Comunidad"))
#Creación del mapa
datos_mapa_coloreado <- mapa_con_datos %>%
mutate(
Uso_Global_Indice = (Frecuencia_Total_Adultos+ Frecuencia_Total_Niños+ Frecuencia_Total_Mayores)/3,
tooltip_data = paste0(
'<b>', ccaa.shortname.es, "</b><br>",
"--------------------------<br>",
"Índice Global: ", round(Uso_Global_Indice, 1), "%<br>",
"Adultos: ", round(Frecuencia_Total_Adultos, 1), "%<br>",
"Niños: ", round(Frecuencia_Total_Niños, 1), "%<br>",
"Mayores: ", round(Frecuencia_Total_Mayores, 1), "%"
)
)
mapa_intensidad <- ggplot(data = datos_mapa_coloreado) +
geom_sf(
aes(fill = Uso_Global_Indice, text = tooltip_data),
color = "white", size = 0.2
) +
geom_sf_text(
aes(label = ccaa.shortname.es),
size = 2,
color = "black",
fontface = "bold",
check_overlap = TRUE
) +
scale_fill_gradient(
low = "#EBF5FB",
high = "#21618C",
name = "Intensidad de Uso"
) +
theme_void() +
labs(title = "Intensidad del uso de TICs en España ") +
theme(
legend.position = "right",
plot.title = element_text(hjust = 0.5, face = "bold")
)
#Para hacer el mapa interactivo
mapa_final_españa <- ggplotly(mapa_intensidad, tooltip = "text") %>%
style(hoveron = "fills", traces = 1) %>%
layout(
hoverlabel = list(bgcolor = "white", bordercolor = "black", font = list(color = "black"))
)
mapa_final_españaEl resultado se debe al factor de la edad media de cada comunidad autónoma, lo explicaremos en el siguiente gráfico.
Podemos observar que las zonas con mayor densidad de población presentan los índices de uso más altos.
Como conclusión de este mapa vemos que el uso de las TICs se concentra donde hay más gente y más joven.
A continuación vamos a definir cual es el perfil de las personas que utilizan las TIC en España, observando en las distintas Comunidades Autónomas y clasificando por edad.
Niños (10-15 años):
Adultos (16-74 años):
Mayores (75+ años):
# Código extraído de: Mapa_España_TICS.R
# Corrección nombres
uso_tic_total_corregido <- uso_tic_total %>%
mutate(
Comunidad = case_when(
Comunidad == "Asturias, Principado de"~"Asturias",
Comunidad == "Balears, Illes" ~ "Baleares",
Comunidad == "Castilla - La Mancha" ~ "Castilla-La Mancha",
Comunidad == "Comunitat Valenciana" ~ "Comunidad Valenciana",
Comunidad == "Madrid, Comunidad de" ~ "Madrid",
Comunidad == "Murcia, Región de" ~ "Murcia",
Comunidad == "Navarra, Comunidad Foral de" ~ "Navarra",
Comunidad == "Rioja, La" ~ "La Rioja",
TRUE ~ Comunidad
)
)
# Pivotaje
uso_tic_total_pivotada <- uso_tic_total_corregido %>%
pivot_longer(
cols= -Comunidad,
names_to = "Grupo_Edad",
values_to = "Frecuencia_Total"
)
orden_grupos <- c("Frecuencia_Total_Niños", "Frecuencia_Total_Adultos", "Frecuencia_Total_Mayores")
names_grupos <- c("Niños (10-15)", "Adultos (16-74)", "Mayores (75+)")
uso_tic_ordenada <- uso_tic_total_pivotada %>%
mutate(Grupo_Edad = factor(Grupo_Edad, levels = orden_grupos, labels = names_grupos))
# Gráfico
ggplot(uso_tic_ordenada, aes(x=Comunidad, y=Frecuencia_Total, fill=Grupo_Edad))+
geom_bar(stat = "identity", position = "dodge")+
labs(
title= "Perfil de Uso Frecuente de las TIC por Edad y Comunidad",
y= "Porcentaje de Uso Promedio (%)",
x= "",
fill = "Grupo de Edad")+
scale_fill_brewer(palette = "Blues") +
theme_classic()+
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size=10),
legend.position = "top"
)Analizamos si la educación actúa como factor protector. El siguiente gráfico de doble eje muestra un cruce revelador:
Línea Azul (TICs): A mayor nivel educativo, mayor uso de tecnología.
Línea Roja (Depresión): A mayor nivel educativo, la depresión cae drásticamente.
# Código extraído de: Grafico_nivel_estudios.R
# AJUSTE: fig.height=6 y l-body-outset para que las líneas se vean claras.
if(exists("tabla_nivel_estudios_final")){
max_tics <- max(tabla_nivel_estudios_final$Porcentaje_TICS, na.rm = TRUE)
max_depresion <- max(tabla_nivel_estudios_final$Porcentaje_Depresion, na.rm = TRUE)
factor_escala <- max_tics / max_depresion
ggplot(tabla_nivel_estudios_final,
aes(x = as.numeric(factor(Nivel_de_estudios,
levels = c("Básico e inferior", "Intermedio", "Superior"))),
group = 1)) +
geom_line(aes(y = Porcentaje_TICS, color = "Uso de TICs"), linewidth = 1.2) +
geom_point(aes(y = Porcentaje_TICS, color = "Uso de TICs"), size = 4) +
geom_text(aes(y = Porcentaje_TICS, label = round(Porcentaje_TICS, 1)), vjust = -1.5, fontface="bold") +
geom_line(aes(y = Porcentaje_Depresion * factor_escala, color = "Depresión"), linewidth = 1.2) +
geom_point(aes(y = Porcentaje_Depresion * factor_escala, color = "Depresión"), size = 4) +
geom_text(aes(y = Porcentaje_Depresion * factor_escala, label = round(Porcentaje_Depresion, 1)), vjust = 2, fontface="bold") +
scale_y_continuous(
name = "Uso de TICs (%)",
sec.axis = sec_axis(~ . / factor_escala, name = "Depresión (%)")
) +
scale_x_continuous(
breaks = 1:3,
labels = c("Básico e inferior", "Intermedio", "Superior"),
name = "Nivel de Estudios"
) +
scale_color_manual(values = c("Uso de TICs" = "#1f77b4", "Depresión" = "#d62728")) +
labs(
title = "Nivel de Estudios: Factor Protector",
subtitle = "Relación inversa entre adopción tecnológica y depresión",
color = ""
) +
theme_classic() +
theme(legend.position = "bottom")
}Finalmente, llegamos a la “Paradoja Digital”. A menudo se asume que la conexión digital mejora las oportunidades, pero los datos muestran una realidad más compleja.
Comparamos dos grupos con niveles similares de uso de internet, pero realidades opuestas:
Estudiantes: Alta conectividad y baja depresión.
Desempleados: Alta conectividad y Muy alta depresión.
df_contexto <- mis_datos_salud_mental$depresion_actividad_economica %>%
rename(
Actividad = `Actividad.económica`,
Tipo_Depresion = `Prevalencia.depresión`,
Porcentaje = Total
) %>%
filter(
Sexo == "Ambos sexos",
Tipo_Depresion == "Cuadro depresivo mayor",
Actividad != "TOTAL"
) %>%
mutate(
Tasa_Depresion = parse_number(Porcentaje, locale = locale(decimal_mark = ",")),
Clave_Union = case_when(
# Intentamos capturar variantes comunes por si acaso
Actividad %in% c("Parado/a", "Parados", "En desempleo", "Desempleado") ~ "En desempleo",
Actividad == "Jubilado/a o prejubilado/a" ~ "Jubilado/Pensionista",
Actividad == "Labores del hogar" ~ "Labores del hogar",
Actividad == "Incapacitado/a para trabajar" ~ "Incapacitado",
TRUE ~ "Otros"
)
)
# Lógica visual simple
df_contexto <- df_contexto %>%
mutate(Color_Barra = ifelse(Tasa_Depresion == max(Tasa_Depresion, na.rm=TRUE), "#C0392B", "#95A5A6"))
# ==============================================================================
# 2. DATOS TIC (Uso de Internet)
# ==============================================================================
lista_frecuencias <- c(
"Han usado Internet diariamente (al menos 5 días a la semana)",
"Han utilizado internet varias veces al día"
)
df_tic_preparado <- mis_datos_tic$uso_internet_socioeconomico %>%
# 1. Renombrar usando los nombres que genera make.names (sin tildes)
rename(
Grupo = Clase.de.población,
Características = Características.socioeconómicas,
Frecuencia = Frecuencia.de.uso,
Total_TIC = Total
) %>%
# 2. Filtros (usando grepl para buscar "diariamente")
filter(
Grupo == "Total de personas (16 a 74 años)",
Frecuencia %in% lista_frecuencias
) %>%
mutate(
# 3. Usamos parse_number otra vez
Tasa_Internet = parse_number(Total_TIC, locale = locale(decimal_mark = ",")),
# 4. Homologación con grepl (equivalente a str_detect)
Clave_Union = case_when(
Características == "Situación laboral: Activos ocupados" ~ "Trabajando",
Características == "Situación laboral: Activos parados" ~ "En desempleo",
Características == "Situación laboral: Inactivos: Estudiantes" ~ "Estudiando",
Características == "Situación laboral: Inactivos: Pensionistas" ~ "Jubilado/Pensionista",
Características == "Situación laboral: Inactivos: Labores del hogar" ~ "Labores del hogar",
TRUE ~ "Otros"
)
) %>%
group_by(Clave_Union) %>%
summarise(Tasa_Internet = mean(Tasa_Internet, na.rm = TRUE))
# ==============================================================================
# 3. UNIÓN FINAL
# ==============================================================================
df_final<- left_join(df_contexto, df_tic_preparado, by = "Clave_Union") %>%
filter(!is.na(Tasa_Internet)) %>%
select(Clave_Union, Tasa_Depresion, Tasa_Internet, Color_Barra)
g1 <- ggplot(df_contexto, aes(x = reorder(Actividad, -Tasa_Depresion), y = Tasa_Depresion)) +
# Barras con color condicional (Rojo para desempleo)
geom_col(aes(fill = Color_Barra), width = 0.6, alpha = 0.9) +
# Etiquetas numéricas sobre las barras
geom_text(aes(label = paste0(Tasa_Depresion, "%")),
vjust = -0.5, fontface = "bold", color = "#2C3E50", size = 3.5) +
scale_fill_identity() +
# Truco técnico: str_wrap parte los textos largos del eje X
scale_x_discrete(labels = function(x) stringr::str_wrap(x, width = 10)) +
scale_y_continuous(limits = c(0, max(df_contexto$Tasa_Depresion) + 1.5)) +
# Títulos con formato HTML (ggtext)
labs(
title = "<span style='font-size:14pt'>1. El Contexto</span>",
subtitle = "El <span style='color:#C0392B'><b>Desempleo</b></span> es el factor crítico en la salud mental base.",
x = "", y = ""
) +
theme_fivethirtyeight() +
theme(
plot.title = element_markdown(face = "bold"),
plot.subtitle = element_markdown(size = 10),
axis.text.x = element_text(size = 8.5, face = "bold", lineheight = 0.9),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA)
)
# ==============================================================================
# 5. VISUALIZACIÓN: GRÁFICO 2 (EL GIRO)
# ==============================================================================
g2 <- ggplot(df_final_narrativa, aes(x = Tasa_Internet, y = Tasa_Depresion)) +
# Línea de tendencia
geom_smooth(method = "lm", se = FALSE, color = "aquamarine1", linetype = "solid", size = 1) +
# Puntos principales con borde blanco (estilo 'pop')
geom_point(aes(fill = Clave_Union), size = 6, shape = 21, color = "white", stroke = 1.5) +
# ggforce: Elipse para resaltar la paradoja (Estudiantes vs Parados)
geom_mark_ellipse(aes(filter = Clave_Union %in% c("En desempleo", "Estudiando"),
label = Clave_Union,
description = "Perfiles opuestos"),
label.fontsize = 8,
label.buffer = unit(5, "mm"),
con.cap = 0,
color = "grey50") +
# ggrepel: Etiquetas para el resto de puntos sin solapamiento
geom_text_repel(aes(label = Clave_Union),
data = subset(df_final_narrativa, !Clave_Union %in% c("En desempleo", "Estudiando")),
size = 3.5, color = "grey40", point.padding = 0.5) +
scale_fill_tableau() +
labs(
title = "<span style='font-size:14pt'>2. El Giro (TICs)</span>",
subtitle = "Alta tecnología no garantiza salud mental: comparar <b style='color:#F28E2B'>Estudiantes</b> vs <b style='color:#094B5B'>Parados</b>.",
x = "Uso Diario de Internet (%)",
y = "Depresión Mayor (%)",
caption = "Fuente: Elaboración propia con datos INE"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_markdown(face = "bold"),
plot.subtitle = element_markdown(size = 10),
legend.position = "none",
axis.title = element_text(size = 9, face = "bold", color = "grey40"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "grey95")
)## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# ==============================================================================
# 6. COMPOSICIÓN FINAL (PATCHWORK)
# ==============================================================================
#Ponemos un gráfico encima del otro con g1 / g2 porque sino se visualiza mal
layout_final <- g1 / g2 +
plot_annotation(
title = 'IMPACTO DEL TRABAJO Y LA BRECHA DIGITAL EN LA SALUD MENTAL',
subtitle = 'Análisis cruzado de Encuesta Europea de Salud y Encuesta TIC',
theme = theme(plot.title = element_text(size = 18, face = "bold", hjust = 0.5))
)
# Mostrar resultado final
print(layout_final)## `geom_smooth()` using formula = 'y ~ x'